//package com.hs.jhzd.service.message;
//
//import java.io.IOException;
//import java.util.Date;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.amqp.core.ExchangeTypes;
//import org.springframework.amqp.rabbit.annotation.Exchange;
//import org.springframework.amqp.rabbit.annotation.Queue;
//import org.springframework.amqp.rabbit.annotation.QueueBinding;
//import org.springframework.amqp.rabbit.annotation.RabbitListener;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.annotation.Conditional;
//import org.springframework.stereotype.Component;
//import com.hs.jhzd.config.MqCondition;
//import com.hs.jhzd.entity.ChatRecord;
//import com.hs.jhzd.repository.ChatRecordRepository;
//import com.hs.jhzd.utils.DateUtils;
//import lombok.extern.slf4j.Slf4j;
//
//@Component
//@Slf4j
//@Conditional(MqCondition.class)
//public class ChatStatusReceiver {
//
//  private static final String CHAT_STATUS_TYPE_START = "start";
//  private static final String CHAT_STATUS_TYPE_TALKING = "talking";
//  private static final String CHAT_STATUS_TYPE_FINISH = "finish";
//
//  @Autowired
//  private ChatRecordRepository repository;
//
//  @RabbitListener(containerFactory = "rabbitListenerContainerFactory",
//      bindings = @QueueBinding(
//          value = @Queue(value = "server.talk.status", durable = "false", autoDelete = "false"),
//          exchange = @Exchange(value = "talk.status", type = ExchangeTypes.TOPIC, durable = "false",
//              autoDelete = "false"),
//          key = "#"))
//  public void process(ChatStatus chatStatus) throws IOException {
//    try {
//      log.debug("收到对讲消息：" + chatStatus.toString());
//      statusHandler(chatStatus);
//      recordHandler(chatStatus);
//    } catch (Exception e) {
//      log.error("接收对讲消息异常", e);
//    }
//  }
//
//  private void statusHandler(ChatStatus chatStatus) {
//
//  }
//
//  private void recordHandler(ChatStatus chatStatus) {
//    if (chatStatus == null || StringUtils.isBlank(chatStatus.getId())
//        || StringUtils.isBlank(chatStatus.getStatus())) {
//      return;
//    }
//
//    switch (chatStatus.getStatus()) {
//      case ChatStatus.STATUS_DIALLING:
//        store(talkDialling(chatStatus), CHAT_STATUS_TYPE_START);
//        break;
//      case ChatStatus.STATUS_ANSWERING:
//        break;
//      case ChatStatus.STATUS_TALKING:
//        store(talkTaking(chatStatus), CHAT_STATUS_TYPE_TALKING);
//        break;
//      case ChatStatus.STATUS_FINISH:
//        store(talkFinish(chatStatus), CHAT_STATUS_TYPE_FINISH);
//        break;
//      case ChatStatus.STATUS_TIME_OUT:
//        store(talkTimeOut(chatStatus), CHAT_STATUS_TYPE_FINISH);
//        break;
//      case ChatStatus.STATUS_REFUSE:
//        store(talkRefuse(chatStatus), CHAT_STATUS_TYPE_FINISH);
//        break;
//      case ChatStatus.STATUS_DROP:
//        store(talkDrop(chatStatus), CHAT_STATUS_TYPE_FINISH);
//        break;
//      case ChatStatus.STATUS_OFFLINE:
//        store(talkClientOffline(chatStatus), CHAT_STATUS_TYPE_FINISH);
//        break;
//      default:
//        log.error("illegal talk status");
//    }
//  }
//
//  private ChatRecord talkClientOffline(ChatStatus chatStatus) {
//    ChatRecord chatRecord = getByChatStatusId(chatStatus.getId());
//    if (chatRecord == null) {
//      log.error("talkTimeOut->no cache for dialling!");
//      chatRecord = this.talkTaking(chatStatus);
//    } else if (StringUtils.isNotBlank(chatRecord.getCompleteStatus())
//        && chatRecord.getCompleteStatus().equals(ChatStatus.STATUS_FINISH)) {
//      return null;
//    }
//
//    chatRecord.setPrisonId(chatStatus.getPrisonId());
//    chatRecord.setCompleteStatus(ChatStatus.STATUS_OFFLINE);
//    chatRecord.setDormCode(chatStatus.getDormCode());
//
//    return chatRecord;
//  }
//
//  private ChatRecord talkDialling(ChatStatus chatStatus) {
//    ChatRecord chatRecord = new ChatRecord();
//    chatRecord.setChatStatusId(chatStatus.getId());
//    chatRecord.setPrisonId(chatStatus.getPrisonId());
//    chatRecord.setChatRequestTime(new Date());
//    chatRecord.setInitiatorIp(chatStatus.getInitiatorIp());
//    chatRecord.setChatType(chatStatus.getChatType());
//    chatRecord.setCreateTime(new Date());
//    if (StringUtils.isNotBlank(chatStatus.getPoliceId())) {
//      chatRecord.setPoliceId(chatStatus.getPoliceId());
//    }
//    chatRecord.setDormCode(chatStatus.getDormCode());
//    return chatRecord;
//  }
//
//  private ChatRecord talkTaking(ChatStatus chatStatus) {
//    ChatRecord chatRecord = getByChatStatusId(chatStatus.getId());
//    if (chatRecord == null) {
//      log.error("talkTaking->no cache for talkDialling!chatStatus id =" + chatStatus.getId());
//      chatRecord = this.talkDialling(chatStatus);
//    } else {
//      if (StringUtils.isNotBlank(chatRecord.getCompleteStatus())
//          && chatRecord.getCompleteStatus().equals(ChatStatus.STATUS_FINISH)) {
//        return null;
//      }
//    }
//    chatRecord.setPrisonId(chatStatus.getPrisonId());
//    chatRecord.setPoliceId(chatStatus.getPoliceId());
//    chatRecord.setChatStartTime(new Date());
//    chatRecord.setReceiverIp(chatStatus.getReceiverIp());
//    chatRecord.setDormCode(chatStatus.getDormCode());
//
//    return chatRecord;
//  }
//
//  private ChatRecord talkFinish(ChatStatus chatStatus) {
//    ChatRecord chatRecord = getByChatStatusId(chatStatus.getId());
//    if (chatRecord == null) {
//      log.error("talkFinish->no cache for talkTaking!chatStatus id =" + chatStatus.getId());
//      chatRecord = this.talkTaking(chatStatus);
//    } else {
//      if (StringUtils.isNotBlank(chatRecord.getCompleteStatus())
//          && chatRecord.getCompleteStatus().equals(ChatStatus.STATUS_FINISH)) {
//        return null;
//      }
//    }
//    chatRecord.setPrisonId(chatStatus.getPrisonId());
//    chatRecord.setCompleteStatus(ChatStatus.STATUS_FINISH);
//    Date talkEndDate = new Date();
//    Date talkStartDate = chatRecord.getChatStartTime();
//    int callDuration = DateUtils.getDifference(talkEndDate, talkStartDate);
//
//    chatRecord.setChatEndTime(talkEndDate);
//    chatRecord.setCallDuration(callDuration < 0 ? 0 : callDuration);
//
//    chatRecord.setChatVideo(chatStatus.getChatVideo());
//    chatRecord.setDormCode(chatStatus.getDormCode());
//
//    return chatRecord;
//  }
//
//  private ChatRecord talkTimeOut(ChatStatus chatStatus) {
//    ChatRecord chatRecord = getByChatStatusId(chatStatus.getId());
//    if (chatRecord == null) {
//      log.error("talkTimeOut->no cache for dialling!");
//      chatRecord = this.talkTaking(chatStatus);
//    } else {
//      if (StringUtils.isNotBlank(chatRecord.getCompleteStatus())
//          && chatRecord.getCompleteStatus().equals(ChatStatus.STATUS_FINISH)) {
//        return null;
//      }
//    }
//    chatRecord.setPrisonId(chatStatus.getPrisonId());
//    chatRecord.setCompleteStatus(ChatStatus.STATUS_TIME_OUT);
//    chatRecord.setDormCode(chatStatus.getDormCode());
//
//    return chatRecord;
//  }
//
//  private ChatRecord talkRefuse(ChatStatus chatStatus) {
//    ChatRecord chatRecord = getByChatStatusId(chatStatus.getId());
//    if (chatRecord == null) {
//      log.error("talkRefuse->no cache for dialling!");
//      chatRecord = this.talkTaking(chatStatus);
//    } else {
//      if (StringUtils.isNotBlank(chatRecord.getCompleteStatus())
//          && chatRecord.getCompleteStatus().equals(ChatStatus.STATUS_FINISH)) {
//        return null;
//      }
//    }
//    chatRecord.setPrisonId(chatStatus.getPrisonId());
//    chatRecord.setCompleteStatus(ChatStatus.STATUS_REFUSE);
//    chatRecord.setDormCode(chatStatus.getDormCode());
//
//    return chatRecord;
//  }
//
//  private ChatRecord talkDrop(ChatStatus chatStatus) {
//    ChatRecord chatRecord = getByChatStatusId(chatStatus.getId());
//    if (chatRecord == null) {
//      log.error("talkDrop->no cache for talking!");
//      chatRecord = this.talkTaking(chatStatus);
//    } else {
//      if (StringUtils.isNotBlank(chatRecord.getCompleteStatus())
//          && chatRecord.getCompleteStatus().equals(ChatStatus.STATUS_FINISH)) {
//        return null;
//      }
//    }
//    chatRecord.setPrisonId(chatStatus.getPrisonId());
//    chatRecord.setCompleteStatus(ChatStatus.STATUS_DROP);
//    chatRecord.setDormCode(chatStatus.getDormCode());
//
//    return chatRecord;
//  }
//
//  private ChatRecord getByChatStatusId(String chatStatusId) {
//    return repository.findByChatStatusId(chatStatusId);
//  }
//
//  private void store(ChatRecord chatRecord, String chatStatusType) {
//    if (chatRecord == null || StringUtils.isBlank(chatStatusType)) {
//      return;
//    }
//    ChatRecord chatRecordOld = repository.findByChatStatusId(chatRecord.getChatStatusId());
//    boolean oldRecordIsNull = chatRecordOld == null;
//
//    switch (chatStatusType) {
//      case CHAT_STATUS_TYPE_START:
//        if (oldRecordIsNull) {
//          repository.save(chatRecord);
//        }
//        break;
//      case CHAT_STATUS_TYPE_TALKING:
//        if (chatRecord.getChatRequestTime() == null) {
//          chatRecord.setChatRequestTime(new Date());
//        }
//        if (chatRecord.getChatStartTime() == null) {
//          chatRecord.setChatStartTime(new Date());
//        }
//        repository.save(chatRecord);
//
//        break;
//      case CHAT_STATUS_TYPE_FINISH:
//        repository.save(chatRecord);
//        log.info("store->通话结束，保存记录到数据库。chatStatus id = " + chatRecord.getChatStatusId());
//        break;
//      default:
//        break;
//    }
//  }
//
//}
